﻿using DbSQLite;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;

namespace Callchecker
{
    class SQ_Message : DbFacadeSQLite
    {
        #region Внешние поля

        /// <summary>
        /// Идентификтор записи в базе данных
        /// </summary>
        public int ID { get { return _id; } }

        /// <summary>
        /// Время внесения записи в базу данных
        /// </summary>
        public DateTime DT { get { return _dt; } set { _dt = value; } }

        /// <summary>
        /// Текст сообщения сохраненного в базе данных
        /// </summary>
        public string MSG { get { return _msg; } set { _msg = value; } }

        /// <summary>
        /// Детальная информация о сообщении
        /// </summary>
        public string DETAILS { get { return _details; } set { _details = value; } }

        #endregion

        #region Методы класса

        /// <summary>
        /// Сохранение состояния объекта в виде записи в базе данных
        /// </summary>
        /// <returns>Идентификатор записи в базе</returns>
        public int SaveToDb()
        {
            ParametersCollection parameters = new ParametersCollection();
            parameters.Add("dt", _dt, DbType.DateTime);
            parameters.Add("msg", _msg, DbType.String);
            parameters.Add("details", _details, DbType.String);

            return base.Insert("messages", parameters); //вставка одной записи 
        }

        /// <summary>
        /// Возвращается экземпляр класса по запрошенному идентификтору из базы данных
        /// </summary>
        /// <param name="id">Идентификатор записи в базе данных</param>
        /// <returns>Экземпляр класса с заполненными полями</returns>
        public static SQ_Message Load(int id)
        {
            ParametersCollection parameters = new ParametersCollection();
            parameters.Add("id", id, DbType.Int32);

            SQ_Message sq = new SQ_Message();
            DataTable db = sq.Execute("select id, dt, msg, details from messages where id = @id", parameters);

            if (db.Rows.Count > 0)
            {
                sq._id = db.Rows[0].Field<int>("id");
                sq._dt = db.Rows[0].Field<DateTime>("dt");
                sq._msg = db.Rows[0].Field<string>("msg");
                sq._details = db.Rows[0].Field<string>("details");
            }
            return sq;
        }

        /// <summary>
        /// Получение запроса по датам
        /// </summary>
        /// <param name="df">Датао от</param>
        /// <param name="dt">Дата по</param>
        /// <returns>Результирующий набор данных</returns>
        public static DataTable SequenceByDate(DateTime df, DateTime dt)
        {
            ParametersCollection parameters = new ParametersCollection();
            parameters.Add("df", df, DbType.DateTime);
            parameters.Add("dt", dt, DbType.DateTime);

            SQ_Message sq = new SQ_Message();
            return sq.Execute("select id, dt, msg, details from messages where dt between @df AND @dt", parameters);
        }

        #endregion

        #region Constructors

        public SQ_Message() : base(Common.SETTING_DB)
        {
            if (!File.Exists(Common.SETTING_DB) || new FileInfo(Common.SETTING_DB).Length == 0)
            {
                base.ExecuteNonQuery(@"CREATE TABLE [messages] (
                    [id] integer PRIMARY KEY AUTOINCREMENT NOT NULL,
                    [dt] DateTime NOT NULL,
                    [msg] TEXT NOT NULL,
                    [details] TEXT NOT NULL
                    )");
            }
            else
            {
                DataTable dt = base.Execute("PRAGMA table_info([messages])");
                if ( dt.AsEnumerable().Where(n => n.Field<string>("name") == "details").Count() == 0)
                    base.ExecuteNonQuery(@"ALTER TABLE [messages] ADD COLUMN [details] TEXT NOT NULL DEFAULT ''");
            }
        }

        #endregion

        #region Private Fields

        private int _id = 0;
        private string _msg = "";
        private DateTime _dt = DateTime.Now;
        private string _details = "";

        #endregion


    }
}
